parser grammar CParser;

options {
  language = Java;
 tokenVocab = CLexer;
}


@header {
  package ejercicio3;
  import java.util.ArrayList;
}

@members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
}

entrada: funcion EOF;

//funcion :  VOID nombre PARENTESIS VOID PARENTESIS LLAVES cuerpo_func LLAVES;
funcion : retorno IDENT PARENTESIS IDENT PARENTESIS;

retorno : VOID;

cuerpo_func : (declaraciones | asignacion | bucle_while)+;

bucle_while : WHILE PARENTESIS comparacion PARENTESIS LLAVES cuerpo_while LLAVES;

cuerpo_while : sentencia_if asignacion;

declaraciones : INT IDENT COMA IDENT SEPARADOR;

tipo : VOID | INT;

sentencia_if : IF PARENTESIS NUMERO OPMUL comparacion PARENTESIS LLAVES cuerpo_if LLAVES; 

//comparacion : (NUMERO OPMUL)? IDENT COMPARADOR IDENT;
comparacion : LETRA COMPARADOR LETRA;

cuerpo_if : (asignacion | llamada_funcion | llamada_break)+;

llamada_break : BREAK SEPARADOR;

asignacion : exp SEPARADOR;

//exp : LETRA OPASIG (LETRA | NUMERO) ((OPSUMA | OPMUL) (LETRA | NUMERO))?; 
exp : LETRA OPASIG LETRA;

llamada_funcion : IDENT PARENTESIS parametros PARENTESIS SEPARADOR;

parametros : (COMILLAS CADENA COMILLAS COMA LETRA); 